<?php


namespace app\api\common;


use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class JwtToken
{
    /**
     * @param $user_id
     * @return string
     */
    public function getToken($user_id)
    {
        $time = time(); //当前时间
        $conf = get_system_config('token');
        $token = [
            'iss' => $conf['iss'], //签发者 可选
            'aud' => $conf['aud'], //接收该JWT的一方，可选
            'iat' => $time, //签发时间
            'nbf' => $time - 1, //(Not Before)：某个时间点后才能访问，比如设置time+30，表示当前时间30秒后才能使用
            'exp' => $time + $conf['exptime'], //过期时间,这里设置2个小时
            'data' => [
                //自定义信息，不要定义敏感信息
                'userid' => $user_id,
            ]
        ];
        return JWT::encode($token, $conf['secrect'], 'HS256'); //输出Token  默认'HS256'
    }

    /**
     * @param $token
     */
    public static function checkToken($token)
    {
        $config = get_system_config('token');
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地

            $decoded = JWT::decode($token, new Key($config['secrect'], 'HS256')); //HS256方式，这里要和签发的时候对应
            return (array)$decoded;
        } catch (\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
            return json(['code' => 403, 'msg' => '签名错误']);
        } catch (\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
            return json(['code' => 401, 'msg' => 'token失效']);
        } catch (\Firebase\JWT\ExpiredException $e) {  // token过期
            return json(['code' => 401, 'msg' => 'token已过期']);
        } catch (Exception $e) {  //其他错误
            return json(['code' => 404, 'msg' => '非法请求']);
        } catch (\UnexpectedValueException $e) {  //其他错误
            return json(['code' => 404, 'msg' => '非法请求']);
        } catch (\DomainException $e) {  //其他错误
            return json(['code' => 404, 'msg' => '非法请求']);
        }

    }

    public static function getUidByToken($token){
        $config = get_system_config('token');
        if(!empty($token)){
            $decoded = JWT::decode($token, new Key($config['secrect'], 'HS256'));
            $res= (array)$decoded;
            $data=$res['data']??[];
            if($data){
                return $data->userid;
            }
        }
        return null;
    }
}